#ifndef __BSP_SPI_FLASH_W25QXX_H__
#define __BSP_SPI_FLASH_W25QXX_H__




#include "bsp.h"


#define RCC_W25QXX_PORT (RCC_AHB1Periph_GPIOB)		/* GPIO端口时钟 */

#define W25QXX_CS_PORT	    GPIOB
#define W25QXX_CS_PIN	    GPIO_Pin_14

#define W25QXX_SCK_PORT	    GPIOB
#define W25QXX_SCK_PIN	    GPIO_Pin_3

#define W25QXX_MOSI_PORT	GPIOB
#define W25QXX_MOSI_PIN	    GPIO_Pin_5

#define W25QXX_MISO_PORT	GPIOB
#define W25QXX_MISO_PIN	    GPIO_Pin_4

//#define JEDEC_ID              0xEF3015		//W25X16
//#define JEDEC_ID              0xEF4015		//W25Q16
#define JEDEC_ID              0xEF4018		//W25Q128
// #define JEDEC_ID              0xEF4017		//W25Q64

/* FLASHÐ¾Æ¬ÁÐ±í */
#define W25Q80      0XEF13          /* W25Q80   Ð¾Æ¬ID */
#define W25Q16      0XEF14          /* W25Q16   Ð¾Æ¬ID */
#define W25Q32      0XEF15          /* W25Q32   Ð¾Æ¬ID */
#define W25Q64      0XEF16          /* W25Q64   Ð¾Æ¬ID */
#define W25Q128     0XEF17          /* W25Q128  Ð¾Æ¬ID */
#define W25Q256     0XEF18          /* W25Q256  Ð¾Æ¬ID */
#define BY25Q64     0X6816          /* BY25Q64  Ð¾Æ¬ID */
#define BY25Q128    0X6817          /* BY25Q128 Ð¾Æ¬ID */
#define NM25Q64     0X5216          /* NM25Q64  Ð¾Æ¬ID */
#define NM25Q128    0X5217          /* NM25Q128 Ð¾Æ¬ID */

#define W25Q_DUMMY_BYTE			0xFF	// 可以为任意字节

/* ---------- 命令字节 ---------- */
#define W25Q_WRITE_ENABLE		0x06
#define W25Q_WRITE_DISABLE		0x04
#define W25Q_STATUS_REG1		0x05
#define W25Q_STATUS_REG2		0x35
#define W25Q_PAGE_PROGRAM		0x02
#define W25Q_SECTOR_ERASE		0x20
#define W25Q_BLOCK32_ERASE		0x52
#define W25Q_BLOCK64_ERASE		0xD8
#define W25Q_POWER_DOWN			0xB9
#define W25Q_READ_DATA			0x03
#define W25Q_FAST_READ			0x0B
#define W25Q_RELEASE_POWER_DOWN	0xAB
#define W25Q_DEVICE_ID			0xAB
#define W25Q_MANUFACTURER_ID	0x90
#define W25Q_JEDEC_ID			0x9F
#define W25Q_UNIQUE_ID_NUM		0x4B

#define W25Q_CHIP_ERASE			0xC7

/* ------------ End ------------ */

/* Status Registers Bit */
#define BIT_BUSY				0x01
#define BIT_WEL					0x02

#define W25Q_PAGE_SIZE			256

void bsp_spi_flash_w25qxx_Init(void);

/* ID read function */
uint32_t W25Qxx_Read_JEDECID(void);
uint16_t W25Qxx_Read_Manufacturer_ID(void);
uint8_t W25Qxx_Read_DeviceID(void);

/* Programming function */
void W25Qxx_Page_Program( uint8_t *pBuffer, uint32_t Address, uint16_t Len );
void W25Qxx_Write_Flash( uint8_t *pBuffer, uint32_t Address, uint16_t Len );
void W25Qxx_Read_Flash( uint8_t *pBuffer, uint32_t Address, uint16_t Len );
void W25Qxx_Sector_Erase( uint32_t Address);
void W25Qxx_Chip_Erase(void);

void W25Qxx_Write_Enable(void);
void W25Qxx_Write_Disable(void);
void W25Qxx_Power_Down(void);
void W25Qxx_Release_PowerDown(void);




#endif
